package com.sunni;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.crypto.hash.Md5Hash;
import org.apache.shiro.crypto.hash.SimpleHash;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;

import java.util.Arrays;

/**
 * Hello world!
 *
 */
public class App 
{
    public void test01 (){//static void main( String[] args ) {
       /*
       * 1.
       *
       *
       * */

//       1. 创建安全管理 工厂
        IniSecurityManagerFactory factory = new IniSecurityManagerFactory("classpath:shiro.ini");

//        2. * 创建 安全管理中心（shiro所有东西都由它控制）
        SecurityManager securityManager = factory.getInstance();

//        3.把安全中心 部署到安装环境
        SecurityUtils.setSecurityManager(securityManager);

//        4.创建Subject主体（存着你的.ini里的信息）
        Subject subject = SecurityUtils.getSubject();

//        5.创建token凭证 （你输入的账号、密码）
        UsernamePasswordToken token = new UsernamePasswordToken("sunni", "1234");

//        6.用户登录(作比对)  token信息 和 .ini信息(后期写在数据库) 对不对
        try {
            subject.login(token);
        } catch (UnknownAccountException u) {
            System.out.println("---账号不存在！---");
        } catch (IncorrectCredentialsException i){
            System.out.println("--- 密码不正确！---");
        }
        System.out.println("是否登陆成功：" + (subject.isAuthenticated()?"成功":"失败"));

//        7.退出登录
        subject.logout();
        System.out.println("退出是否登陆成功：" + (subject.isAuthenticated()?"成功":"失败"));

    }


    public void test02() {
        String password = "admin";
        /*散列密码 MD5 每次加密都是一样的 1234对应xxx*/

        System.out.println(new Md5Hash("admin","yan",2));

        System.out.println(new SimpleHash("MD5",password,"yan",2));

    }

    /*测试 md5加密以后能不能登陆成功*/
    public void test03() {
        //       1. 创建安全管理 工厂
        IniSecurityManagerFactory factory = new IniSecurityManagerFactory("classpath:shiro.ini");

//        2. * 创建 安全管理中心（shiro所有东西都由它控制）
        SecurityManager securityManager = factory.getInstance();

//        3.把安全中心 部署到安装环境
        SecurityUtils.setSecurityManager(securityManager);

//        4.创建Subject主体（存着你的.ini里的信息）
        Subject subject = SecurityUtils.getSubject();

//        5.创建token凭证 （你输入的账号、密码）
        UsernamePasswordToken token = new UsernamePasswordToken("sunni", "1234");

//        6.用户登录(作比对)  token信息 和 .ini信息(后期写在数据库) 对不对
        try {
            subject.login(token);
        } catch (UnknownAccountException u) {
            System.out.println("---账号不存在！---");
        } catch (IncorrectCredentialsException i){
            System.out.println("--- 密码不正确！---");
        }
        System.out.println("是否登陆成功：" + (subject.isAuthenticated()?"成功":"失败"));

//        7.退出登录
        subject.logout();
        System.out.println("退出是否登陆成功：" + (subject.isAuthenticated()?"成功":"失败"));

    }

    /*测试  用户有木有角色、权限*/
    public void test04() {
//        1. 创建安全管理 工厂
        IniSecurityManagerFactory factory = new IniSecurityManagerFactory("classpath:shiro-permission.ini");

//        2. * 创建 安全管理中心（shiro所有东西都由它控制）
        SecurityManager securityManager = factory.getInstance();

//        3.把安全中心 部署到安装环境
        SecurityUtils.setSecurityManager(securityManager);

//        4.创建Subject主体（存着你的.ini里的信息）
        Subject subject = SecurityUtils.getSubject();

//        5.创建token凭证 （你输入的账号、密码）
        UsernamePasswordToken token = new UsernamePasswordToken("sunni", "1234");

//        6.用户登录(作比对)  token信息 和 .ini信息(后期写在数据库) 对不对
        try {
            subject.login(token);
        } catch (UnknownAccountException u) {
            System.out.println("---账号不存在！---");
        } catch (IncorrectCredentialsException i){
            System.out.println("--- 密码不正确！---");
        }
        System.out.println("是否登陆成功：" + (subject.isAuthenticated()?"成功":"失败"));


        System.out.println("------------判断有木有角色-------------");
        /*判断 有没有这个角色*/
        /*单个判断*/
        System.out.println(subject.hasRole("role1")?"有role1":"没role1");
        System.out.println(subject.hasRole("role2")?"有role2":"没有role2");
        System.out.println(subject.hasRole("role3")?"有role3":"没有role3");

        /*批量判断*/
        System.out.println(subject.hasAllRoles(Arrays.asList("role1", "role2"))?"全有":"部分没有 全没有");
        System.out.println(subject.hasAllRoles(Arrays.asList("role1", "role2", "role3"))?"全有":"部分没有 全没有");

        System.out.println();
        System.out.println("------------判断有木有权限-------------");
        /*判断 有木有这个权限*/
        /*单个*/
        System.out.println(subject.isPermitted("user:insert")?"有权限":"没有权限");
        System.out.println(subject.isPermittedAll("user:insert","user:delete")?"有权限":"没有权限");


        /*权限 分配给 角色，再判断 是不是这个角色，就可以知道有木有这个权限*/

        /*也可以直接判断，角色有木有权限*/
    }

    /*测试  用户有木有角色、权限*/
    public static void main(String[] args) {
//        1. 创建安全管理 工厂
        IniSecurityManagerFactory factory = new IniSecurityManagerFactory("classpath:shiro.ini");

//        2. * 创建 安全管理中心（shiro所有东西都由它控制）
        SecurityManager securityManager = factory.getInstance();

//        3.把安全中心 部署到安装环境
        SecurityUtils.setSecurityManager(securityManager);

//        4.创建Subject主体（存着你的.ini里的信息）
        Subject subject = SecurityUtils.getSubject();

//        5.创建token凭证 （你输入的账号、密码）
        UsernamePasswordToken token = new UsernamePasswordToken("sunni", "1234");

//        6.用户登录(作比对)  token信息 和 .ini信息(后期写在数据库) 对不对
        try {
            subject.login(token);
        } catch (UnknownAccountException u) {
            System.out.println("---账号不存在！---");
        } catch (IncorrectCredentialsException i){
            System.out.println("--- 密码不正确！---");
        }
        System.out.println("是否登陆成功：" + (subject.isAuthenticated()?"成功":"失败"));


        System.out.println("------------判断有木有角色-------------");
        /*判断 有没有这个角色*/
        /*单个判断*/
        System.out.println(subject.hasRole("role1")?"有role1":"没role1");
        System.out.println(subject.hasRole("role2")?"有role2":"没有role2");
        System.out.println(subject.hasRole("role3")?"有role3":"没有role3");

        /*批量判断*/
        System.out.println(subject.hasAllRoles(Arrays.asList("role1", "role2"))?"全有":"部分没有 全没有");
        System.out.println(subject.hasAllRoles(Arrays.asList("role1", "role2", "role3"))?"全有":"部分没有 全没有");

        System.out.println();
        System.out.println("------------判断有木有权限-------------");
        /*判断 有木有这个权限*/
        /*单个*/
        System.out.println(subject.isPermitted("user:insert")?"有权限":"没有权限");
        System.out.println(subject.isPermitted("user:delete")?"有权限":"没有权限");
        System.out.println(subject.isPermittedAll("user:insert","user:delete")?"有权限":"没有权限");


        /*权限 分配给 角色，再判断 是不是这个角色，就可以知道有木有这个权限*/

        /*也可以直接判断，角色有木有权限*/


    }

}
